{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分类模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "import torchvision\n",
    "from torchvision import datasets, transforms\n",
    "from torch.utils.data import DataLoader\n",
    "\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_data_loader(root, batch_size, for_train=True):\n",
    "    transform = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        transforms.Normalize((0.1307), (0.3081))\n",
    "    ])\n",
    "    \n",
    "    dataset = datasets.MNIST(\n",
    "        root = root,\n",
    "        train = for_train,\n",
    "        transform = transform,\n",
    "        download=True\n",
    "    )\n",
    "    \n",
    "    loader = DataLoader(\n",
    "        dataset=dataset,\n",
    "        batch_size=batch_size,\n",
    "        shuffle=for_train\n",
    "    )\n",
    "    \n",
    "    return loader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net, self).__init__()\n",
    "        \n",
    "        # 1. (b, 1, 28, 28) -> (b, 16, 24, 24) -> (b, 16, 12, 12)\n",
    "        self.block1 = nn.Sequential(\n",
    "            nn.Conv2d(1, 16, 5),\n",
    "            nn.MaxPool2d(2),\n",
    "            nn.ReLU()\n",
    "        )\n",
    "        \n",
    "        # 2. (b, 16, 12, 12) -> dropout ->(b, 32, 10, 10) -> (b, 32, 5, 5)\n",
    "        self.block2 = nn.Sequential(\n",
    "            nn.Conv2d(16, 32, 3),\n",
    "            nn.Dropout2d(),\n",
    "            nn.MaxPool2d(2),\n",
    "            nn.ReLU()\n",
    "        )\n",
    "        \n",
    "        # 3. (b, 800) -> (b, 160)\n",
    "        self.fc1 = nn.Sequential(\n",
    "            nn.Linear(800, 160),\n",
    "            nn.ReLU(),\n",
    "            nn.Dropout()\n",
    "        )\n",
    "        \n",
    "        # 4. (b, 160) -> (b, 10)\n",
    "        self.fc2 = nn.Sequential(\n",
    "            nn.Linear(160, 10),\n",
    "            nn.LogSoftmax(dim=-1)\n",
    "        )\n",
    "        \n",
    "    def forward(self, x):\n",
    "        \"\"\"\n",
    "        x: (batch_size, 1, 28, 28)\n",
    "        \"\"\"\n",
    "        x = self.block1(x)\n",
    "        x = self.block2(x)\n",
    "        x = x.view(x.shape[0], -1)\n",
    "        x = self.fc1(x)\n",
    "        x = self.fc2(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def test(net, test_loader):\n",
    "    net.eval()\n",
    "    test_loss = 0\n",
    "    correct = 0\n",
    "    length = 0\n",
    "    with torch.no_grad():\n",
    "        for x, y in test_loader:\n",
    "            y_hat = net(x)\n",
    "            # print(x.shape, y.shape, y_hat.shape)\n",
    "            test_loss += nn.functional.nll_loss(y_hat, y)\n",
    "            pred = torch.argmax(y_hat, dim=-1)\n",
    "            correct += torch.eq(pred, y).sum()\n",
    "            length += pred.numel()\n",
    "        print(\"total correct rate: {}\\n\".format(correct / length))\n",
    "    return correct / length\n",
    "\n",
    "def train(net, optimizer, n_epochs, train_loader, test_loader, log_interval):\n",
    "    train_loss = []\n",
    "    \n",
    "    for epoch in range(n_epochs):\n",
    "        net.train()\n",
    "        for index, (x, y) in enumerate(train_loader):\n",
    "            optimizer.zero_grad()\n",
    "            y_hat = net(x)\n",
    "            loss = nn.functional.nll_loss(y_hat, y)\n",
    "            loss.backward()\n",
    "            optimizer.step()\n",
    "            \n",
    "            if index % log_interval == 0:\n",
    "                print(\"epoch: {}\\t batch: {}\\t loss: {}\".format(epoch, index, loss.item()))\n",
    "                train_loss.append(loss.item())\n",
    "\n",
    "        torch.save(net.state_dict(), \"./model.pth\")\n",
    "\n",
    "        test(net, test_loader)\n",
    "        \n",
    "    return train_loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<torch._C.Generator at 0x7eff1478a030>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "batch_size_train = 64\n",
    "batch_size_test = 10000\n",
    "n_epochs = 5\n",
    "learning_rate = 0.01\n",
    "momentum = 0.5\n",
    "log_interval = 20\n",
    "random_seed = 1\n",
    "torch.manual_seed(random_seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0, batch: 0, loss: 2.3077845573425293\n",
      "epoch: 0, batch: 20, loss: 2.2543296813964844\n",
      "epoch: 0, batch: 40, loss: 2.219815969467163\n",
      "epoch: 0, batch: 60, loss: 2.1035385131835938\n",
      "epoch: 0, batch: 80, loss: 1.8287943601608276\n",
      "epoch: 0, batch: 100, loss: 1.4423524141311646\n",
      "epoch: 0, batch: 120, loss: 1.0698721408843994\n",
      "epoch: 0, batch: 140, loss: 1.1722277402877808\n",
      "epoch: 0, batch: 160, loss: 0.9615517854690552\n",
      "epoch: 0, batch: 180, loss: 0.6868805885314941\n",
      "epoch: 0, batch: 200, loss: 0.8532083034515381\n",
      "epoch: 0, batch: 220, loss: 0.6713714003562927\n",
      "epoch: 0, batch: 240, loss: 0.6038135886192322\n",
      "epoch: 0, batch: 260, loss: 0.846162736415863\n",
      "epoch: 0, batch: 280, loss: 0.5345088839530945\n",
      "epoch: 0, batch: 300, loss: 0.5540302991867065\n",
      "epoch: 0, batch: 320, loss: 0.5837243795394897\n",
      "epoch: 0, batch: 340, loss: 0.49168822169303894\n",
      "epoch: 0, batch: 360, loss: 0.5275545716285706\n",
      "epoch: 0, batch: 380, loss: 0.5368872880935669\n",
      "epoch: 0, batch: 400, loss: 0.40501806139945984\n",
      "epoch: 0, batch: 420, loss: 0.4746144115924835\n",
      "epoch: 0, batch: 440, loss: 0.4876817464828491\n",
      "epoch: 0, batch: 460, loss: 0.5322809219360352\n",
      "epoch: 0, batch: 480, loss: 0.406648725271225\n",
      "epoch: 0, batch: 500, loss: 0.28407204151153564\n",
      "epoch: 0, batch: 520, loss: 0.35265854001045227\n",
      "epoch: 0, batch: 540, loss: 0.2747003734111786\n",
      "epoch: 0, batch: 560, loss: 0.5208778381347656\n",
      "epoch: 0, batch: 580, loss: 0.4984716475009918\n",
      "epoch: 0, batch: 600, loss: 0.307683527469635\n",
      "epoch: 0, batch: 620, loss: 0.5812892913818359\n",
      "epoch: 0, batch: 640, loss: 0.4177972078323364\n",
      "epoch: 0, batch: 660, loss: 0.33186110854148865\n",
      "epoch: 0, batch: 680, loss: 0.6528480052947998\n",
      "epoch: 0, batch: 700, loss: 0.2906312942504883\n",
      "epoch: 0, batch: 720, loss: 0.21969279646873474\n",
      "epoch: 0, batch: 740, loss: 0.38734012842178345\n",
      "epoch: 0, batch: 760, loss: 0.26303720474243164\n",
      "epoch: 0, batch: 780, loss: 0.2693400979042053\n",
      "epoch: 0, batch: 800, loss: 0.19234919548034668\n",
      "epoch: 0, batch: 820, loss: 0.2052008956670761\n",
      "epoch: 0, batch: 840, loss: 0.30657827854156494\n",
      "epoch: 0, batch: 860, loss: 0.3012416958808899\n",
      "epoch: 0, batch: 880, loss: 0.34474486112594604\n",
      "epoch: 0, batch: 900, loss: 0.2814720571041107\n",
      "epoch: 0, batch: 920, loss: 0.40253713726997375\n",
      "\n",
      "total correct rate: 0.9555000066757202\n",
      "epoch: 1, batch: 0, loss: 0.5386812686920166\n",
      "epoch: 1, batch: 20, loss: 0.25984254479408264\n",
      "epoch: 1, batch: 40, loss: 0.40793925523757935\n",
      "epoch: 1, batch: 60, loss: 0.28429722785949707\n",
      "epoch: 1, batch: 80, loss: 0.14615631103515625\n",
      "epoch: 1, batch: 100, loss: 0.2251335233449936\n",
      "epoch: 1, batch: 120, loss: 0.18069450557231903\n",
      "epoch: 1, batch: 140, loss: 0.17451944947242737\n",
      "epoch: 1, batch: 160, loss: 0.32382065057754517\n",
      "epoch: 1, batch: 180, loss: 0.27325648069381714\n",
      "epoch: 1, batch: 200, loss: 0.4433649778366089\n",
      "epoch: 1, batch: 220, loss: 0.1965446174144745\n",
      "epoch: 1, batch: 240, loss: 0.2552731931209564\n",
      "epoch: 1, batch: 260, loss: 0.2438662052154541\n",
      "epoch: 1, batch: 280, loss: 0.14657874405384064\n",
      "epoch: 1, batch: 300, loss: 0.26773419976234436\n",
      "epoch: 1, batch: 320, loss: 0.3524707555770874\n",
      "epoch: 1, batch: 340, loss: 0.2192595899105072\n",
      "epoch: 1, batch: 360, loss: 0.3078601062297821\n",
      "epoch: 1, batch: 380, loss: 0.20430319011211395\n",
      "epoch: 1, batch: 400, loss: 0.1288323998451233\n",
      "epoch: 1, batch: 420, loss: 0.25685977935791016\n",
      "epoch: 1, batch: 440, loss: 0.2544781267642975\n",
      "epoch: 1, batch: 460, loss: 0.17128844559192657\n",
      "epoch: 1, batch: 480, loss: 0.20037323236465454\n",
      "epoch: 1, batch: 500, loss: 0.15422287583351135\n",
      "epoch: 1, batch: 520, loss: 0.19448846578598022\n",
      "epoch: 1, batch: 540, loss: 0.23049688339233398\n",
      "epoch: 1, batch: 560, loss: 0.3838168978691101\n",
      "epoch: 1, batch: 580, loss: 0.05151888728141785\n",
      "epoch: 1, batch: 600, loss: 0.3258037269115448\n",
      "epoch: 1, batch: 620, loss: 0.24165524542331696\n",
      "epoch: 1, batch: 640, loss: 0.1641874462366104\n",
      "epoch: 1, batch: 660, loss: 0.1640375554561615\n",
      "epoch: 1, batch: 680, loss: 0.09624821692705154\n",
      "epoch: 1, batch: 700, loss: 0.14648115634918213\n",
      "epoch: 1, batch: 720, loss: 0.31119784712791443\n",
      "epoch: 1, batch: 740, loss: 0.24127134680747986\n",
      "epoch: 1, batch: 760, loss: 0.2801962196826935\n",
      "epoch: 1, batch: 780, loss: 0.26169121265411377\n",
      "epoch: 1, batch: 800, loss: 0.10669923573732376\n",
      "epoch: 1, batch: 820, loss: 0.19186167418956757\n",
      "epoch: 1, batch: 840, loss: 0.054483480751514435\n",
      "epoch: 1, batch: 860, loss: 0.21976718306541443\n",
      "epoch: 1, batch: 880, loss: 0.3266172409057617\n",
      "epoch: 1, batch: 900, loss: 0.22809869050979614\n",
      "epoch: 1, batch: 920, loss: 0.26710307598114014\n",
      "\n",
      "total correct rate: 0.9728000164031982\n",
      "epoch: 2, batch: 0, loss: 0.10299090296030045\n",
      "epoch: 2, batch: 20, loss: 0.07095500826835632\n",
      "epoch: 2, batch: 40, loss: 0.13945047557353973\n",
      "epoch: 2, batch: 60, loss: 0.13653847575187683\n",
      "epoch: 2, batch: 80, loss: 0.2083221822977066\n",
      "epoch: 2, batch: 100, loss: 0.1472623646259308\n",
      "epoch: 2, batch: 120, loss: 0.5641843676567078\n",
      "epoch: 2, batch: 140, loss: 0.16771776974201202\n",
      "epoch: 2, batch: 160, loss: 0.15065167844295502\n",
      "epoch: 2, batch: 180, loss: 0.051557864993810654\n",
      "epoch: 2, batch: 200, loss: 0.13512836396694183\n",
      "epoch: 2, batch: 220, loss: 0.22502058744430542\n",
      "epoch: 2, batch: 240, loss: 0.25829336047172546\n",
      "epoch: 2, batch: 260, loss: 0.17187532782554626\n",
      "epoch: 2, batch: 280, loss: 0.08819416910409927\n",
      "epoch: 2, batch: 300, loss: 0.2646416127681732\n",
      "epoch: 2, batch: 320, loss: 0.11910861730575562\n",
      "epoch: 2, batch: 340, loss: 0.129984050989151\n",
      "epoch: 2, batch: 360, loss: 0.10911940038204193\n",
      "epoch: 2, batch: 380, loss: 0.19095565378665924\n",
      "epoch: 2, batch: 400, loss: 0.14956913888454437\n",
      "epoch: 2, batch: 420, loss: 0.13982276618480682\n",
      "epoch: 2, batch: 440, loss: 0.25397688150405884\n",
      "epoch: 2, batch: 460, loss: 0.164730042219162\n",
      "epoch: 2, batch: 480, loss: 0.1595693677663803\n",
      "epoch: 2, batch: 500, loss: 0.11467351764440536\n",
      "epoch: 2, batch: 520, loss: 0.1313120722770691\n",
      "epoch: 2, batch: 540, loss: 0.1712125688791275\n",
      "epoch: 2, batch: 560, loss: 0.33058667182922363\n",
      "epoch: 2, batch: 580, loss: 0.12825405597686768\n",
      "epoch: 2, batch: 600, loss: 0.16735945641994476\n",
      "epoch: 2, batch: 620, loss: 0.2644040882587433\n",
      "epoch: 2, batch: 640, loss: 0.1251354068517685\n",
      "epoch: 2, batch: 660, loss: 0.10799061506986618\n",
      "epoch: 2, batch: 680, loss: 0.31394365429878235\n",
      "epoch: 2, batch: 700, loss: 0.05834605544805527\n",
      "epoch: 2, batch: 720, loss: 0.12027141451835632\n",
      "epoch: 2, batch: 740, loss: 0.20043407380580902\n",
      "epoch: 2, batch: 760, loss: 0.28521987795829773\n",
      "epoch: 2, batch: 780, loss: 0.10529569536447525\n",
      "epoch: 2, batch: 800, loss: 0.1058589369058609\n",
      "epoch: 2, batch: 820, loss: 0.310822069644928\n",
      "epoch: 2, batch: 840, loss: 0.2570793330669403\n",
      "epoch: 2, batch: 860, loss: 0.07080311328172684\n",
      "epoch: 2, batch: 880, loss: 0.2160646766424179\n",
      "epoch: 2, batch: 900, loss: 0.15359382331371307\n",
      "epoch: 2, batch: 920, loss: 0.22627198696136475\n",
      "\n",
      "total correct rate: 0.9768999814987183\n",
      "epoch: 3, batch: 0, loss: 0.08615002036094666\n",
      "epoch: 3, batch: 20, loss: 0.14778727293014526\n",
      "epoch: 3, batch: 40, loss: 0.13249431550502777\n",
      "epoch: 3, batch: 60, loss: 0.18907040357589722\n",
      "epoch: 3, batch: 80, loss: 0.18010535836219788\n",
      "epoch: 3, batch: 100, loss: 0.12969467043876648\n",
      "epoch: 3, batch: 120, loss: 0.2510485053062439\n",
      "epoch: 3, batch: 140, loss: 0.1057765930891037\n",
      "epoch: 3, batch: 160, loss: 0.14437228441238403\n",
      "epoch: 3, batch: 180, loss: 0.2134457528591156\n",
      "epoch: 3, batch: 200, loss: 0.12713748216629028\n",
      "epoch: 3, batch: 220, loss: 0.10770656913518906\n",
      "epoch: 3, batch: 240, loss: 0.13531093299388885\n",
      "epoch: 3, batch: 260, loss: 0.18169939517974854\n",
      "epoch: 3, batch: 280, loss: 0.1604783833026886\n",
      "epoch: 3, batch: 300, loss: 0.20268569886684418\n",
      "epoch: 3, batch: 320, loss: 0.06433986872434616\n",
      "epoch: 3, batch: 340, loss: 0.11879777908325195\n",
      "epoch: 3, batch: 360, loss: 0.15868738293647766\n",
      "epoch: 3, batch: 380, loss: 0.08549950271844864\n",
      "epoch: 3, batch: 400, loss: 0.08180535584688187\n",
      "epoch: 3, batch: 420, loss: 0.060999978333711624\n",
      "epoch: 3, batch: 440, loss: 0.11920327693223953\n",
      "epoch: 3, batch: 460, loss: 0.2151060551404953\n",
      "epoch: 3, batch: 480, loss: 0.18877603113651276\n",
      "epoch: 3, batch: 500, loss: 0.1032596305012703\n",
      "epoch: 3, batch: 520, loss: 0.34872230887413025\n",
      "epoch: 3, batch: 540, loss: 0.09661898761987686\n",
      "epoch: 3, batch: 560, loss: 0.06549020856618881\n",
      "epoch: 3, batch: 580, loss: 0.16252054274082184\n",
      "epoch: 3, batch: 600, loss: 0.14727255702018738\n",
      "epoch: 3, batch: 620, loss: 0.17897485196590424\n",
      "epoch: 3, batch: 640, loss: 0.13171818852424622\n",
      "epoch: 3, batch: 660, loss: 0.3762686252593994\n",
      "epoch: 3, batch: 680, loss: 0.15893182158470154\n",
      "epoch: 3, batch: 700, loss: 0.2212546318769455\n",
      "epoch: 3, batch: 720, loss: 0.1087714284658432\n",
      "epoch: 3, batch: 740, loss: 0.23340190947055817\n",
      "epoch: 3, batch: 760, loss: 0.03259241580963135\n",
      "epoch: 3, batch: 780, loss: 0.08158577978610992\n",
      "epoch: 3, batch: 800, loss: 0.07450640201568604\n",
      "epoch: 3, batch: 820, loss: 0.05406181141734123\n",
      "epoch: 3, batch: 840, loss: 0.045980457216501236\n",
      "epoch: 3, batch: 860, loss: 0.14649075269699097\n",
      "epoch: 3, batch: 880, loss: 0.14600923657417297\n",
      "epoch: 3, batch: 900, loss: 0.10100351274013519\n",
      "epoch: 3, batch: 920, loss: 0.24715077877044678\n",
      "\n",
      "total correct rate: 0.9807999730110168\n",
      "epoch: 4, batch: 0, loss: 0.11086425185203552\n",
      "epoch: 4, batch: 20, loss: 0.03404494747519493\n",
      "epoch: 4, batch: 40, loss: 0.09753866493701935\n",
      "epoch: 4, batch: 60, loss: 0.26508641242980957\n",
      "epoch: 4, batch: 80, loss: 0.21088796854019165\n",
      "epoch: 4, batch: 100, loss: 0.08600401878356934\n",
      "epoch: 4, batch: 120, loss: 0.07809720933437347\n",
      "epoch: 4, batch: 140, loss: 0.09358484297990799\n",
      "epoch: 4, batch: 160, loss: 0.14159934222698212\n",
      "epoch: 4, batch: 180, loss: 0.15089823305606842\n",
      "epoch: 4, batch: 200, loss: 0.23906661570072174\n",
      "epoch: 4, batch: 220, loss: 0.07708369940519333\n",
      "epoch: 4, batch: 240, loss: 0.12313234806060791\n",
      "epoch: 4, batch: 260, loss: 0.15225060284137726\n",
      "epoch: 4, batch: 280, loss: 0.5099954605102539\n",
      "epoch: 4, batch: 300, loss: 0.1668148636817932\n",
      "epoch: 4, batch: 320, loss: 0.1397360861301422\n",
      "epoch: 4, batch: 340, loss: 0.10920165479183197\n",
      "epoch: 4, batch: 360, loss: 0.21022027730941772\n",
      "epoch: 4, batch: 380, loss: 0.19060739874839783\n",
      "epoch: 4, batch: 400, loss: 0.048821888864040375\n",
      "epoch: 4, batch: 420, loss: 0.28649914264678955\n",
      "epoch: 4, batch: 440, loss: 0.11615970730781555\n",
      "epoch: 4, batch: 460, loss: 0.16013206541538239\n",
      "epoch: 4, batch: 480, loss: 0.10717152804136276\n",
      "epoch: 4, batch: 500, loss: 0.08958110213279724\n",
      "epoch: 4, batch: 520, loss: 0.04586535692214966\n",
      "epoch: 4, batch: 540, loss: 0.1288161277770996\n",
      "epoch: 4, batch: 560, loss: 0.10676702857017517\n",
      "epoch: 4, batch: 580, loss: 0.1295437216758728\n",
      "epoch: 4, batch: 600, loss: 0.21170465648174286\n",
      "epoch: 4, batch: 620, loss: 0.02494622766971588\n",
      "epoch: 4, batch: 640, loss: 0.2174750417470932\n",
      "epoch: 4, batch: 660, loss: 0.08656175434589386\n",
      "epoch: 4, batch: 680, loss: 0.10141154378652573\n",
      "epoch: 4, batch: 700, loss: 0.03339952602982521\n",
      "epoch: 4, batch: 720, loss: 0.086004339158535\n",
      "epoch: 4, batch: 740, loss: 0.15892280638217926\n",
      "epoch: 4, batch: 760, loss: 0.251906156539917\n",
      "epoch: 4, batch: 780, loss: 0.10159754008054733\n",
      "epoch: 4, batch: 800, loss: 0.11081871390342712\n",
      "epoch: 4, batch: 820, loss: 0.07238330692052841\n",
      "epoch: 4, batch: 840, loss: 0.14781352877616882\n",
      "epoch: 4, batch: 860, loss: 0.15393871068954468\n",
      "epoch: 4, batch: 880, loss: 0.07167625427246094\n",
      "epoch: 4, batch: 900, loss: 0.05284168943762779\n",
      "epoch: 4, batch: 920, loss: 0.10898423939943314\n",
      "\n",
      "total correct rate: 0.9837999939918518\n"
     ]
    }
   ],
   "source": [
    "train_loader = get_data_loader(\"./data\", batch_size_train)\n",
    "test_loader = get_data_loader(\"./data\", batch_size_test, for_train=False)\n",
    "\n",
    "net = Net()\n",
    "optimizer = torch.optim.SGD(net.parameters(), lr=learning_rate, momentum=momentum)\n",
    "\n",
    "history = train(net, optimizer, n_epochs, train_loader, test_loader, log_interval)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7efed01f2d60>]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(list(range(len(history))), history)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# FGSM 攻击"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "def perturb_fgsm(epsilon):\n",
    "    def func(x):\n",
    "        \"\"\"\n",
    "        x: 样本\n",
    "        \"\"\"\n",
    "        sign_data_grad = x.grad.data.sign()\n",
    "        perturbed_image = x + epsilon * sign_data_grad\n",
    "        perturbed_image = torch.clamp(perturbed_image, 0, 1)\n",
    "        return perturbed_image\n",
    "    return func\n",
    "\n",
    "\n",
    "def test_and_attack(net, test_loader, perturb, flag_target=False, label=None):\n",
    "    \"\"\"生成对抗样本\n",
    "\n",
    "    Args:\n",
    "        net (): 网络\n",
    "        test_loader (): 测试集\n",
    "        perturb (): 扰动方法\n",
    "        flag_target (bool, optional): 是否确定攻击目标，若是，则攻击目标为，将图像错误识别为label参数指定的目标. Defaults to False.\n",
    "        label (int, optional): 指定攻击目标. Defaults to None.\n",
    "\n",
    "    Returns:\n",
    "        tuple: (攻击后的准确率， 对抗样本)\n",
    "    \"\"\"\n",
    "    adv_examples = []\n",
    "    first_correct_number = 0\n",
    "    total_number = 0\n",
    "    attack_success_number = 0\n",
    "    for x, target in test_loader:\n",
    "        total_number += 1\n",
    "        \n",
    "        x.requires_grad = True\n",
    "        output = net(x)\n",
    "        first_pred = torch.argmax(output, dim=-1)\n",
    "\n",
    "        if first_pred.item() == target.item():\n",
    "            # 预测对了，才进行攻击，否则不攻击\n",
    "            first_correct_number += 1\n",
    "            \n",
    "            if flag_target:\n",
    "                assert label is not None, \"指定label\"\n",
    "                # assert type(label)\n",
    "                loss = -nn.functional.nll_loss(output, torch.tensor(label).view_as(target))\n",
    "            else: \n",
    "                loss = nn.functional.nll_loss(output, target)\n",
    "            net.zero_grad()\n",
    "            loss.backward()\n",
    "            \n",
    "            perturbed_x = perturb(x)\n",
    "            output = net(perturbed_x)\n",
    "            second_pred = torch.argmax(output, dim=-1)\n",
    "            \n",
    "            if second_pred.item() == target.item():\n",
    "                # 攻击仍然失败\n",
    "                pass\n",
    "            else:\n",
    "                if flag_target:\n",
    "                    # 如果定目标攻击，只保存对特定目标的误判\n",
    "                    if second_pred.item() == label:\n",
    "                        # 攻击成功，最多保存10个成功案例用于分析\n",
    "                        attack_success_number += 1\n",
    "                        if (len(adv_examples) < 10):\n",
    "                            raw = x.squeeze().detach().cpu().numpy()\n",
    "                            adv = perturbed_x.squeeze().detach().cpu().numpy()\n",
    "                            adv_examples.append((first_pred.item(), second_pred.item(), raw, adv))\n",
    "                else:\n",
    "                    attack_success_number += 1\n",
    "                    if (len(adv_examples) < 10):\n",
    "                        raw = x.squeeze().detach().cpu().numpy()\n",
    "                        adv = perturbed_x.squeeze().detach().cpu().numpy()\n",
    "                        adv_examples.append((first_pred.item(), second_pred.item(), raw, adv))\n",
    "        \n",
    "    #计算准确率\n",
    "    s = \"total / attack / success: {} / {} / {} \\t total accuracy: {}\".format(\n",
    "        total_number, first_correct_number, attack_success_number, \n",
    "        (first_correct_number - attack_success_number) / total_number\n",
    "    )\n",
    "    print(s)\n",
    "    \n",
    "    #返回准确率和攻击样例\n",
    "    return (first_correct_number - attack_success_number) / total_number, adv_examples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "total correct rate: 0.9837999939918518\n"
     ]
    }
   ],
   "source": [
    "pretrained_net = Net()\n",
    "pretrained_net.load_state_dict(torch.load(\"./model.pth\"))\n",
    "test(pretrained_net, get_data_loader(\"./data\", 10000, False))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "args: epsilon 0.2\ttotal / attack / success: 10000 / 9838 / 134 \t total accuracy: 0.9704\n",
      "args: epsilon 0.25\ttotal / attack / success: 10000 / 9838 / 164 \t total accuracy: 0.9674\n",
      "args: epsilon 0.3\ttotal / attack / success: 10000 / 9838 / 202 \t total accuracy: 0.9636\n",
      "args: epsilon 0.35\ttotal / attack / success: 10000 / 9838 / 253 \t total accuracy: 0.9585\n",
      "args: epsilon 0.4\ttotal / attack / success: 10000 / 9838 / 311 \t total accuracy: 0.9527\n",
      "args: epsilon 0.5\ttotal / attack / success: 10000 / 9838 / 776 \t total accuracy: 0.9062\n"
     ]
    }
   ],
   "source": [
    "epsilons = [0.2, 0.25, 0.3, 0.35, 0.4, 0.5]\n",
    "\n",
    "accuracies = []\n",
    "examples = []\n",
    "for eps in epsilons:\n",
    "    print(\"args: epsilon {}\".format(eps), end=\"\\t\")\n",
    "    acc, ex = test_and_attack(\n",
    "        pretrained_net, \n",
    "        get_data_loader(\"./data\", 1, False), \n",
    "        perturb_fgsm(eps), \n",
    "        flag_target=False, \n",
    "        label=2\n",
    "    )\n",
    "    accuracies.append(acc)\n",
    "    examples.append(ex)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "args: epsilon 0.2\ttotal / attack / success: 10000 / 9838 / 18 \t total accuracy: 0.982\n",
      "args: epsilon 0.25\ttotal / attack / success: 10000 / 9838 / 22 \t total accuracy: 0.9816\n",
      "args: epsilon 0.3\ttotal / attack / success: 10000 / 9838 / 29 \t total accuracy: 0.9809\n",
      "args: epsilon 0.35\ttotal / attack / success: 10000 / 9838 / 36 \t total accuracy: 0.9802\n",
      "args: epsilon 0.4\ttotal / attack / success: 10000 / 9838 / 47 \t total accuracy: 0.9791\n",
      "args: epsilon 0.5\ttotal / attack / success: 10000 / 9838 / 129 \t total accuracy: 0.9709\n"
     ]
    }
   ],
   "source": [
    "epsilons = [0.2, 0.25, 0.3, 0.35, 0.4, 0.5]\n",
    "\n",
    "accuracies = []\n",
    "examples = []\n",
    "for eps in epsilons:\n",
    "    print(\"args: epsilon {}\".format(eps), end=\"\\t\")\n",
    "    acc, ex = test_and_attack(\n",
    "        pretrained_net, \n",
    "        get_data_loader(\"./data\", 1, False), \n",
    "        perturb_fgsm(eps), \n",
    "        flag_target=True, \n",
    "        label=2\n",
    "    )\n",
    "    accuracies.append(acc)\n",
    "    examples.append(ex)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "a = examples[0]\n",
    "for item in a:\n",
    "    f, ax = plt.subplots(1, 3)\n",
    "    \n",
    "    raw, per = item[2], item[3]\n",
    "    dif = per - raw\n",
    "    \n",
    "    ax[0].imshow(raw, cmap=\"gray\")\n",
    "    ax[0].set_title(\"result: {}\".format(item[0]))\n",
    "    ax[1].imshow(per, cmap=\"gray\")\n",
    "    ax[1].set_title(\"result: {}\".format(item[1]))\n",
    "    ax[2].imshow(dif, cmap=\"gray\")\n",
    "    \n",
    "    plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "69cf07945e49730ae47ef67e7fe560dc46d26b6f5532501fc3cfc63bcf9ec543"
  },
  "kernelspec": {
   "display_name": "Python 3.9.7 64-bit ('base': conda)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
